package mkw.demo.vol;

/**
 * 最后的执行结果为 500 或者小于 500的结果，之所以出现小于500的结果是因为
 * number++ 不是原子性操作
 * 它分为 3 步 
 * 1.获取 number 得值
 * 2.对 number 值加1
 * 3.将 number 的值同步到主内存中。
 * 结果不是 500 的情况 可能是 一个线程对 number +1 后还没有同步到 主内存便被阻塞住，
 * 另外一个线程又从主内存中获取number 进行 加一操作，
 * 这之后无论哪个线程将数据同步到主内存后都会错
 * @author Administrator
 *
 */
public class VolatileDemo {
	
	private volatile int number=0;
	
	public int getNumber(){
		return number;
	}
	
	public void increase(){
		this.number++;
	}

	public static void main(String[] args) {
		
		VolatileDemo volDemo = new VolatileDemo();
		for (int i = 0; i < 500; i++) {
			new Thread(new Runnable(){
				@Override
				public void run(){
					volDemo.increase();
				}
			}).start();
		}
		//如果还有子线程在运行，主线程就让出CPU资源。
		//直到所有的子线程都运行完了，主线程再继续往下运行。
		while (Thread.activeCount()>1) {
			Thread.yield();
			
		}
	}

}














